#include "SL.h"
//顺序表的初始化
void SLInit(SL* sl)
{
    assert(sl);
    sl->date = NULL;
    sl->capacity = sl->size = 0;
}
//顺序表的销毁
void SLDestroy(SL* sl)
{
    assert(sl);
    if(sl->date != NULL)
    {
        free(sl->date);
        sl->date = NULL;
    }
    sl->capacity = sl->size = 0;
}
//申请空间
void BuyCapacity(SL* sl)
{
    //首先判断空间是否足够
    if(sl->size == sl->capacity)
    {
        int newCapacity = sl->capacity == 0? 4 : 2 * sl->capacity;
        SLDateType* newArr = (SLDateType*)realloc(sl->date,sizeof(SLDateType)*newCapacity);
        if(newArr == NULL)
        {
            perror("realloc error!\n");
            exit(1);
        }
        sl->date = newArr;
        sl->capacity = newCapacity;
    }
}
//顺序表的尾插
void SLPushBack(SL* sl,SLDateType value)
{
    assert(sl);
    BuyCapacity(sl);
    *(sl->date + sl->size++) = value;
}
//顺序表的头插
void SLPushFront(SL* sl,SLDateType value)
{
    assert(sl);
    //判断空间是否足够
    BuyCapacity(sl);
    //挪动数据
    for(int i = sl->size;i >= 1;i --)
    {
        *(sl->date + i) = *(sl->date + i - 1);
    }
    *(sl->date) = value;
    sl->size++;
}
//顺序表的打印
void SLPrintf(SL* sl)
{
    assert(sl);
    for(int i = 0;i < sl->size;i++)
    {
        printf("%d ",*(sl->date + i));
    }
    printf("\n");
}
//顺序表的尾删
void SLPopBack(SL* sl)
{
    assert(sl && sl->size >= 0);
    sl->size--;
}
//顺序表的头删
void SLPopFront(SL* sl)
{
    assert(sl && sl->size >= 0);
    for(int i = 1;i < sl->size;i++)
    {
        *(sl->date + i - 1) = *(sl->date + i);
    }
    sl->size--;
}
//顺序表指定位置插入
void SLPosPush(SL* sl,int pos,SLDateType value)
{
    assert(sl && pos >= 0 && pos <= sl->size);
    //判断空间是否足够
    BuyCapacity(sl);
    for(int i = sl->size;i > pos;i--)
    {
        *(sl->date + i) = *(sl->date + i - 1);
    }
    *(sl->date + pos) = value;
    sl->size ++;
}
//顺序表指定位置删除
void SLPosPop(SL* sl,int pos)
{
    assert(sl && pos >= 0 && pos < sl->size);
    for(int i = pos;i < sl->size;i++)
    {
        *(sl->date + i) = *(sl->date + i + 1);
    }
    sl->size--;
}
//顺序表的查找
int SLFind(SL* sl,SLDateType x)
{
    assert(sl);
    for(int i = 0;i < sl->size;i++)
    {
        if(*(sl->date + i) == x)
        {
            return i;
        }
    }
    return -1;
}